package com.lcx.security.main;



import com.lcx.security.FFmpegCommandManager.FFmpegManager;
import com.lcx.security.FFmpegCommandManager.FFmpegManagerImpl;
import com.lcx.security.config.StreamConfig;
import com.lcx.security.myenum.StreamEnum;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.HashMap;
import java.util.Map;

/**
 * 测试
 * @since jdk1.7
 */
public class FFmpegCMD {

	protected static Logger logger = LoggerFactory.getLogger(FFmpegCMD.class);
	/**
	 * 命令组装器测试
	 * 
	 * @throws InterruptedException
	 */

	// ffmpeg -re -i /home/lee/video.mp4 -vcodec copy -acodec copy -b:v 800k
	// -b:a 32k -f flv rtmp://localhost/videotest

	// -re :
	// 表示使用文件的原始帧率进行读取，因为ffmpeg读取视频帧的速度很快，如果不使用这个参数，ffmpeg可以在很短时间就把video.mp4中的视频帧全部读取完并进行推流，这样就无法体现出视频播放的效果了。官方文档中对这个参数的解释是：
	// -i :这个参数表示输入 ，后面/home/lee/video.mp4 就是输入文件。
	// -vcodec copy : -vcodec表示使用的视频编解码器 ，前缀v表示video。后面紧跟的copy
	// 表示复制使用源文件的视频编解码器，比如原文件的编解码器(codec)是h264，则这里就使用h264。
	// -acodec copy : -acodec表示使用的音频编解码器，前缀a表示audio。后面的copy 表示使用源文件的音频编解码器。
	// -b:v 800k : -b:v表示视频的比特率(bitrate) ，为800k。
	// -b:a 32k : 表示音频的比特率为32k。
	// -f flv : -f表示format
	// ，就是强制输出格式为flv，这一步其实也叫封装(mux)，封装要做的事就是把视频和音频混合在一起，进行同步。紧跟在后面的rtmp://localhost/videotest
	// 表示输出的"文件名"，这个文件名可以是一个本地的文件，也可以指定为rtmp流媒体地址。指定为rtmp流媒体地址后，则ffmpeg就可以进行推流。

//	public static void test1() throws InterruptedException {
//		FFmpegManager manager = new FFmpegManagerImpl();
//		Map<String, String> map = new HashMap<String, String>();
//		map.put("appName", "test123");
//		// 【rtsp://账号:密码@IP地址:544/cam/realmonitor?channel=1&subtype=0\】【端口号默认544，通道号channel默认1，主码流为
//		// 0（即subtype=0），辅码流为1（即subtype=1）】
//		// map.put("input",
//		// "\"rtsp://admin:dsgbridge@192.168.1.102:554/cam/realmonitor?channel=1&subtype=0\"");
//		// ffmpeg -re -i C:\Users\Tang\Desktop\maven\a.mp4 -vcodec h264 -acodec
//		// copy -b:v 2048k -b:a 32k -f flv rtmp://localhost/live
//
//		map.put("input", "C:\\Users\\Tang\\Desktop\\maven\\a.mp4");
//		map.put("output", "\"rtmp://localhost/live/\"");
//		map.put("codec", "h264");
//		map.put("fmt", "flv");
//		map.put("fps", "25");
//		map.put("rs", "640x360");
//		map.put("twoPart", "0");
//		// 执行任务，id就是appName，如果执行失败返回为null
//		String id = manager.start(map);
//		logger.info(id);
//		// 通过id查询
//		/*
//		 * TaskEntity info = manager.query(id); logger.info(info); //
//		 * 查询全部 Collection<TaskEntity> infoList = manager.queryAll();
//		 * logger.info(infoList); Thread.sleep(30000); // 停止id对应的任务
//		 * manager.stop(id);
//		 */
//	}

	/**
	 * 默认方式，rtsp->rtmp转流单个命令测试
	 * 
	 * @throws InterruptedException
	 */
	public static void rtspToRtmp( )  {
		FFmpegManager manager = new FFmpegManagerImpl();
		try {
			// -rtsp_transport tcp
			// 测试多个任何同时执行和停止情况
			// 默认方式发布任务
			String command = "ffmpeg  -stimeout 10000000 -rtsp_transport -i rtsp://macao:GREEmc2022@131.255.83.58:554/h264/ch1/sub/av_stream -vcodec copy -acodec copy -f flv -y rtmp://127.0.0.1:1935/live";
			String rtsp = "ffmpeg  -stimeout 10000000 -rtsp_transport tcp -re -i " + StreamConfig.URL +
					" -vcodec copy -preset ultrafast -acodec copy -f flv " + StreamConfig.RTMP_URL;
			if (StreamConfig.FFMPEG_PATH!=null&&!StreamConfig.FFMPEG_PATH.trim().equals("")){
				rtsp = StreamConfig.FFMPEG_PATH+rtsp;
			}
			logger.info("准备执行："+rtsp);
			String start = manager.start(StreamEnum.RTSP_TO_RTMP,
					rtsp);
			logger.info("当前执行的推流任务的ID是："+start);
		}catch (Exception e){
			e.printStackTrace();
			manager.stopAll();
		}

	}

	/**
	 * rtmp -> hls
	 * 
	 * @throws InterruptedException
	 */
	public static void rtmpToHls() throws InterruptedException {
		FFmpegManager manager = new FFmpegManagerImpl();
		try {
			String rtmpToHls = "ffmpeg -re -i " + StreamConfig.RTMP_URL + "  -vcodec copy -vprofile baseline -acodec copy -ar 44100 -ac 1 -f flv " + StreamConfig.HLS_URL;
			if (StreamConfig.FFMPEG_PATH!=null&&!StreamConfig.FFMPEG_PATH.trim().equals("")){
				rtmpToHls = StreamConfig.FFMPEG_PATH+rtmpToHls;
			}
			logger.info("准备执行："+rtmpToHls);
			String start = manager.start(StreamEnum.RTMP_TO_HLS, rtmpToHls);
			logger.info("当前执行的推流任务的ID是："+start);

		} catch (Exception e) {
			e.printStackTrace();
			manager.stop(StreamEnum.RTMP_TO_HLS.getName());
		}
	}

	/**
	 * hls -> mp4
	 *
	 * @throws InterruptedException
	 */
	public static void hlsToMP4(String filePath) throws InterruptedException {

		FFmpegManager manager = new FFmpegManagerImpl();
		try {
			//-vcodec copy -acodec copy -absf aac_adtstoasc
			String hlsToMP4 = "ffmpeg  -re -i " + StreamConfig.HIVE_URL + "  -vcodec copy -acodec copy -absf aac_adtstoasc " + filePath;
			if (StreamConfig.FFMPEG_PATH!=null&&!StreamConfig.FFMPEG_PATH.trim().equals("")){
				hlsToMP4 = StreamConfig.FFMPEG_PATH+hlsToMP4;
			}
			logger.info("准备执行："+hlsToMP4);
			String start = manager.start(StreamEnum.HLS_TO_MP4, hlsToMP4);
			logger.info("当前执行的推流任务的ID是："+start);

		} catch (Exception e) {
			e.printStackTrace();
			manager.stopAll();
		}
	}

	/**
	 * MP4 -> hls
	 *
	 * @throws InterruptedException
	 */
	public static void mp4ToHls(String filePath ) {
		FFmpegManager manager = new FFmpegManagerImpl();
		try {
			// ffmpeg -re -i test.mp4  -vcodec copy -vprofile baseline -acodec copy -ar 44100 -ac 1 -f flv rtmp://127.0.0.1:1935/live/room
			String mp4ToHls = "ffmpeg  -re -i " + filePath + "  -vcodec copy -vprofile baseline -acodec copy -ar 44100 -ac 1 -f flv " + StreamConfig.HLS_URL;
			if (StreamConfig.FFMPEG_PATH!=null&&!StreamConfig.FFMPEG_PATH.trim().equals("")){
				mp4ToHls = StreamConfig.FFMPEG_PATH+mp4ToHls;
			}
			logger.info("准备执行："+mp4ToHls);
			String start = manager.start(StreamEnum.MP4_TO_HLS, mp4ToHls);
			logger.info("当前执行的推流任务的ID是："+start);

		} catch (Exception e) {
			e.printStackTrace();
			manager.stopAll();
		}
	}

	/**
	 * rtsp-rtmp转流多任务测试
	 * 
	 * @throws InterruptedException
	 */
//	public static void test3() throws InterruptedException {
//		FFmpegManager manager = new FFmpegManagerImpl();
//		// -rtsp_transport tcp
//		// 测试多个任何同时执行和停止情况
//		// false表示使用配置文件中的ffmpeg路径，true表示本条命令已经包含ffmpeg所在的完整路径
//		manager.start("tomcat",
//				"ffmpeg -i rtsp://184.72.239.149/vod/mp4://BigBuckBunny_175k.mov -vcodec copy -acodec copy -f flv -y rtmp://106.14.182.20:1935/rtmp/tomcat",
//				false);
//		manager.start("tomcat1",
//				"ffmpeg -i rtsp://184.72.239.149/vod/mp4://BigBuckBunny_175k.mov -vcodec copy -acodec copy -f flv -y rtmp://106.14.182.20:1935/rtmp/tomcat1",
//				false);
//		manager.start("tomcat2",
//				"ffmpeg -i rtsp://184.72.239.149/vod/mp4://BigBuckBunny_175k.mov -vcodec copy -acodec copy -f flv -y rtmp://106.14.182.20:1935/rtmp/tomcat2",
//				false);
//		manager.start("tomcat3",
//				"ffmpeg -i rtsp://184.72.239.149/vod/mp4://BigBuckBunny_175k.mov -vcodec copy -acodec copy -f flv -y rtmp://106.14.182.20:1935/rtmp/tomcat3",
//				false);
//		manager.start("tomcat4",
//				"ffmpeg -i rtsp://184.72.239.149/vod/mp4://BigBuckBunny_175k.mov -vcodec copy -acodec copy -f flv -y rtmp://106.14.182.20:1935/rtmp/tomcat4",
//				false);
//		manager.start("tomcat5",
//				"ffmpeg -i rtsp://184.72.239.149/vod/mp4://BigBuckBunny_175k.mov -vcodec copy -acodec copy -f flv -y rtmp://106.14.182.20:1935/rtmp/tomcat5",
//				false);
//		manager.start("tomcat6",
//				"ffmpeg -i rtsp://184.72.239.149/vod/mp4://BigBuckBunny_175k.mov -vcodec copy -acodec copy -f flv -y rtmp://106.14.182.20:1935/rtmp/tomcat6",
//				false);
//		manager.start("tomcat7",
//				"ffmpeg -i rtsp://184.72.239.149/vod/mp4://BigBuckBunny_175k.mov -vcodec copy -acodec copy -f flv -y rtmp://106.14.182.20:1935/rtmp/tomcat7",
//				false);
//		manager.start("tomcat8",
//				"ffmpeg -i rtsp://184.72.239.149/vod/mp4://BigBuckBunny_175k.mov -vcodec copy -acodec copy -f flv -y rtmp://106.14.182.20:1935/rtmp/tomcat8",
//				false);
//		manager.start("tomcat9",
//				"ffmpeg -i rtsp://184.72.239.149/vod/mp4://BigBuckBunny_175k.mov -vcodec copy -acodec copy -f flv -y rtmp://106.14.182.20:1935/rtmp/tomcat9",
//				false);
//
//		Thread.sleep(30000);
//		// 停止全部任务
//		manager.stopAll();
//	}

	public static void main(String[] args) throws InterruptedException {
//		test1();
		rtspToRtmp();
		// test3();
//		 test4();
	}
}
